<?
	require_once('MySQLController.php');
	// ###################################
	// # Classe com funções de paginação #
	// ###################################
	class Paginacao
	{
		private $mysqlControl;
		public function __construct($tabela = null,$sql_controller = null)
		{
			if($sql_controller == null)
			{
				$this->mysqlControl = new MySQLController($tabela);
			}
			else
			{
				$this->mysqlControl = $sql_controller;
			}
		}
		
		// Pega os rows paginados de acordo com o GET de paginação
		// O GET precisa respeitar o a seguinte forma: order, orderBy, offset
		public function paginate($_GET, $tabela, $limit, $fields = array(), $offset_default = 0, $options = null) {
			// $num recebe quantos registros tem na tabela			
			$num = $this->mysqlControl->num_linhas($tabela);
			
			if(empty($fields))
			{
				$result = $this->mysqlControl->query('SHOW COLUMNS FROM '. $tabela) or die('Não foi possível conectar ao banco de dados : ' . mysql_error());
				if(mysql_num_rows($result) > 0) {
					while($row = mysql_fetch_assoc($result)) {
						array_push($fields, $row['Field']);
					}
				}
			}
			
			extract($_GET, EXTR_SKIP);
			
			// Tratamento do GET
			if(!empty($offset)) {
				if(is_numeric($offset) && ($offset >= 0) && ($offset <= $num / $limit)) {
					$offset_temp = $limit * $offset;
				} else {
					$offset = $offset_default;
					$offset_temp = $offset_default;
				}
			} else {
				$offset = $offset_default;
				$offset_temp = $offset_default;
			}
			
			switch($order) {
				case 0:
					$order = 'ASC';
					break;
				case 1:
					$order = 'DESC';
					break;
				default:
					$order = 'ASC';
					break;
			}
			
			$orderByTest = 'id';
			
			foreach($fields as $value) {
				if($value == $orderBy) {
					$orderByTest = $value;
					break;
				}
			}
			
			$orderBy = $orderByTest;
			
			// Cria o array de retorno pagination
			$pagination['rows'] = $this->mysqlControl->get_rows($options, $tabela, null, $orderBy, $order, $limit, $offset_temp);
			// TODO: continuar isso -> $pagination['rows'] = $this->ordena_rows($rows); // Ordena os resultados pelo campo de $orderBy
			$pagination['fields'] = $fields;
			$pagination['params'] = compact('order', 'orderBy', 'offset', 'num');
			
			return $pagination;
		}
		
		/**
	    * Mostra páginas da paginação
	    * @param <Array> $params parametros passados para a página ($num, $order, $orderBy, $offset)
	    * @param <int> $limit o limite de páginas a serem mostradas
	    * @param <int> $range quantas páginas são mostradas antes e depois da página atual
	    * @param <String> $page qual a página que é para paginar, o padrão é a index.php
	    * @return <String> O html com os links para paginar
	    */
		// 
		public function show_pages($params, $limit, $range, $pagina_atual = null) {
			extract($params, EXTR_SKIP); // cria as variaveis $num, $order, $orderBy, $offset
			$str = '';
			// $pages recebe o número de páginas
			$pages = ceil($num / $limit);
			// Tratamento do $order
			$order = ($order == 'ASC') ? 0 : 1;
			// $page recebe a página atual no formato de representação
			$page = $offset + 1;
			
			if(!isset($classes)) // se as classes não foram passadas
			
			// Testa se o número de registros é maior que o limit para mostrar ou não as páginas
			if($num > $limit) {
				// Cria a div que exibirá as páginas
				$str .= '<div class="pages">';
				
				// Primeira
				if($offset > 1)
					$str .=  '<a id="primeira_pagina" href="./'.$pagina_atual.'?orderBy='. $orderBy .'&amp;order='. $order .'&amp;offset='. 0 .'">Primeira</a>';
				
				// Anterior
				if($offset >= 1)
					$str .=  '<a id="pagina_anterior" href="./'.$pagina_atual.'?orderBy='. $orderBy .'&amp;order='. $order .'&amp;offset='. ($offset - 1) .'">Anterior</a>';
				
				// Páginas numeradas com range
				for($i = ($page - $range); $i <= ($page + $range); $i++) {
					if($i > 0 && $i <= $pages)
						if($i == $page)
							$str .=  $i;
						else
							$str .=  '<a id="links_nao_selecionados" href="./'.$pagina_atual.'?orderBy='. $orderBy .'&amp;order='. $order .'&amp;offset='. ($i - 1) .'">'. $i .'</a>';
				}
				
				// Próxima
				if($offset <= $pages - 2)
					$str .=  '<a id="proxima_pagina" href="./'.$pagina_atual.'?orderBy='. $orderBy .'&amp;order='. $order .'&amp;offset='. ($offset + 1) .'">Próxima</a>';
				
				// Última
				if($offset < $pages - 2)
					$str .=  '<a id="ultima_pagina" href="./'.$pagina_atual.'?orderBy='. $orderBy .'&amp;order='. $order .'&amp;offset='. ($pages - 1) .'">Última</a>';
				
				$str .=  '</div>';
				return $str;
			}
		}
		
		public function header($path_layout = null)
		{
				$path_layout = ($path_layout == null) ? '../menu/site/layoutUp.php' : $path_layout;
				require(dirname(__FILE__).'/'.$path_layout);
				echo "<div id=\"principal\">";
		}
		
		public function header_adm()
		{
			$this->header('../menu/adm/layoutUp.php'); // Passa o caminho relativo
		}
		
		public function footer($path_layout = null)
		{	
				$path_layout = ($path_layout == null) ? '../menu/site/layoutDown.php' : $path_layout;
				echo "</div>";
				require(dirname(__FILE__).'/'.$path_layout);
		}
		
		public function footer_adm()
		{
			$this->footer('../menu/adm/layoutDown.php'); // Passa o caminho relativo
		}
	}
?>